home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
REVERSEM.ZIP
/
MYPIC.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-09
|
5KB
|
204 lines
/*--------------------------------------------------------------------------
REVERSE :
UNIT : My picture
---------------------------------------------------------------------------*/
// ------------------------------------------------------------------------
// --- INCLUDES
// ------------------------------------------------------------------------
#include<stdlib.h>
#include<stdio.h>
extern "C" {
#include "xtile21!.h"
};
#include<string.h>
#include<alloc.h>
#include"reversem.hpp"
#include"mypic.hpp"
// ------------------------------------------------------------------------
// --- DEFINITIONS
// ------------------------------------------------------------------------
// --- Definitions ---------------------------------------------------------
#define PICTUREX_SIZE 100
#define PICTUREY_SIZE 100
#define PICTURE_DATA_SIZE (PICTUREX_SIZE * PICTUREY_SIZE)
// -- Screen location for picture
#define PICTUREX_LOC 4
#define PICTUREY_LOC 31
// -- Text definitions
#define TEXT_X 8
#define TEXT_Y 134
#define TEXT_X_SIZE 92
#define TEXT_Y_SIZE 22
#define TEXT_COLOR 103
#define TEXT_BACKGROUND 123
// ------------------------------------------------------------------------
// --- PRIVATE MEMBERS
// ------------------------------------------------------------------------
// -- Members : -----------------------------------------------------
void MyPicture::LoadPicture( AVAILABLE_PICTURES Which,
unsigned int FindPic ) {
unsigned char *PicLocation;
long PicOffset;
// Generate a pointer and a file offset.
PicLocation = PicDump + (FindPic * PICTURE_DATA_SIZE);
PicOffset = (long)((long)(Which) * (long)(PICTURE_DATA_SIZE));
fseek( PicFile, PicOffset, SEEK_SET );
fread( PicLocation, PICTURE_DATA_SIZE, 1, PicFile );
};
void MyPicture::DisplayPicture( unsigned int FindPic ) {
XWait_Retrace();
XPut_Tile( PICTUREX_LOC, PICTUREY_LOC, PICTUREX_SIZE, PICTUREY_SIZE,
PicDump + (FindPic * PICTURE_DATA_SIZE) );
};
inline void MyPicture::ClearText( void ) {
XSet_Box( TEXT_X, TEXT_Y, TEXT_X_SIZE, TEXT_Y_SIZE, TEXT_BACKGROUND );
};
// ------------------------------------------------------------------------
// --- CONSTRUCTOR/DESTRUCTOR
// ------------------------------------------------------------------------
MyPicture::MyPicture( void ) {
int Step;
// Open pic file, and allocate pic dump. For now, any error is fatal.
PicFile = fopen( "mypics.cmb", "rb" );
if ( PicFile == NULL ) {
puts( ".. FATAL ERROR .. Unable to open 'mypics.cmb' file.\n\r\n\r");
exit( 1 );
}
PicDump = (unsigned char *) farmalloc( (unsigned long) PICTURE_DATA_SIZE * MAX_LOADED_PICTURES );
if ( PicDump == NULL ) {
puts( ".. FATAL ERROR .. Unable to allocate memory for my pictures.\n\r\n\r");
exit( 1 );
}
// Clear the pictures loaded array.
for (Step = 0; Step < MAX_LOADED_PICTURES; Step++ ) {
LoadPics[Step] = NO_PICTURE;
}
UseTick = 0;
};
MyPicture::~MyPicture() {
// Close file and return memory
fclose( PicFile );
farfree( PicDump );
};
// ------------------------------------------------------------------------
// --- PUBLIC MEMBERS
// ------------------------------------------------------------------------
void MyPicture::Reset( void ) {
int Step;
// Reset the picture system. Clear the loaded and clear the text window.
for (Step = 0; Step < MAX_LOADED_PICTURES; Step++ ) {
LoadPics[Step] = NO_PICTURE;
}
UseTick = 0;
ClearText();
};
void MyPicture::ShowPicture( AVAILABLE_PICTURES Which ) {
unsigned int FindPic;
unsigned int Step;
UseTick++;
// If the picture requested is loaded, then show it.
// If it is not loaded, then first load it.
// If there is no room to load it, then replace the least recently used.
for ( FindPic = 0; FindPic < MAX_LOADED_PICTURES; FindPic++ ) {
if ( LoadPics[FindPic] == Which ) {
// It is loaded!!
DisplayPicture( FindPic );
TickOfLastUse[FindPic] = UseTick;
return;
}
}
// Ok, not loaded. Find a space to load
for ( FindPic = 0; FindPic < MAX_LOADED_PICTURES; FindPic++ ) {
if ( LoadPics[FindPic] == NO_PICTURE ) {
// It is an empty spot!!
LoadPicture( Which, FindPic );
LoadPics[FindPic] = Which;
DisplayPicture( FindPic );
TickOfLastUse[FindPic] = UseTick;
return;
}
}
// Ok, boot the least recently used
FindPic = 0;
for ( Step = 1; Step < MAX_LOADED_PICTURES; Step++ ) {
if ( TickOfLastUse[Step] < TickOfLastUse[FindPic] )
FindPic = Step;
}
LoadPicture( Which, FindPic );
LoadPics[FindPic] = Which;
DisplayPicture( FindPic );
TickOfLastUse[FindPic] = UseTick;
};
void MyPicture::SayText( char* Line1,
char* Line2,
char* Line3 ) {
// Display the lines that are not NULL
ClearText();
if( Line1 != NULL )
XString4_C( TEXT_X, TEXT_Y, TEXT_COLOR, Line1 );
if( Line2 != NULL )
XString4_C( TEXT_X, TEXT_Y+6, TEXT_COLOR, Line2 );
if( Line3 != NULL )
XString4_C( TEXT_X, TEXT_Y+12, TEXT_COLOR, Line3 );
};